package leetcodehot;

import java.util.ArrayDeque;
import java.util.Deque;

public class leetcode32_longestValidParentheses {
    /**
     * 最长有效括号
     * 给你一个只包含 '(' 和 ')' 的字符串，找出最长有效（格式正确且连续）括号子串的长度。
     * 输入：s = "(()"
     * 输出：2
     * 解释：最长有效括号子串是 "()"
     * 示例 2：
     * 输入：s = ")()())"
     * 输出：4
     * 解释：最长有效括号子串是 "()()"
     * 示例 3：
     * 输入：s = ""
     * 输出：0
     */

    //建立一个栈，利用找到一对（）就出栈的原则
//利用当前位置减去栈顶位置可得到pop出的括号数
    public static int longestValidParentheses(String s) {
        //如果为空
        if (s == null || s.length() == 0) return 0;
        //建立一个栈
        Deque<Integer> stack = new ArrayDeque<>();
        //这一步可以防止当第一个Character是')'的时候发生越界异常
        stack.push(-1);
        //System.out.println(stack);
        //可以看到stack是[-1]
        int res = 0;
        //遍历栈找寻合适的左右括号
        for (int i = 0; i < s.length(); i++) {
            //如果找到左括号则入栈，为寻找对应右括号做铺垫
            if (s.charAt(i) == '(') stack.push(i);
            else {
                //如果是右括号则出栈
                stack.pop();
                //但是如果栈是空的话还是得（单身的）把右括号放进来
                if (stack.isEmpty()) stack.push(i);
                else {
                    //当前全部人数减去剩余无法配对的人数（单身）即res
                    res = Math.max(res, i - stack.peek());
                }
            }
        }
        return res;
    }


    public static void main(String[] args) {
        String a = ")())((()";
        System.out.println(longestValidParentheses(a));
    }
}
